<?php
//declare(strict_types=1);
/*
上面一行：strict_types声明必须在脚本中的第一个语句，否则会报如下错误
Fatal error: strict_types declaration must be the very first statement in the script in /guoqiang/www/tp5/public/php7test.php on line 9

*/
##############################################################
//1. 运算符（NULL 合并运算符）
//相当于 $a = isset($_GET['a']) ? $_GET['a'] : 1;
$a = $_GET['a'] ?? 1;
var_dump($a);

##############################################################

//2. 函数返回值类型声明
function arraysSum(array ...$arrays): array 
{ 
    return array_map(function(array $array): int { 
        return array_sum($array); 
    }, $arrays); 
} 

print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));

 
function foo($a) : int 
{ 
    return $a; 
} 
 
print_r(foo(1.0)); 

/*
从这个例子中可以看出现在函数（包括匿名函数）都可以指定返回值的类型。

这种声明的写法有些类似于 swift：

func sayHello(personName: String) -> String { 
    let greeting = "Hello, " + personName + "!" 
    return greeting 
} 
这个特性可以帮助我们避免一些 PHP 的隐式类型转换带来的问题。在定义一个函数之前就想好预期的结果可以避免一些不必要的错误。

不过这里也有一个特点需要注意。PHP 7 增加了一个 declare 指令：strict_types，既使用严格模式。

使用返回值类型声明时，如果没有声明为严格模式，如果返回值不是预期的类型，PHP 还是会对其进行强制类型转换。但是如果是严格模式， 则会出发一个 TypeError 的 Fatal error。

######################
强制模式：

<php 
function foo($a) : int 
{ 
    return $a; 
} 
 
foo(1.0); 
以上代码可以正常执行，foo 函数返回 int 1，没有任何错误。
######################

######################
严格模式：

<php 
declare(strict_types=1); 
 
function foo($a) : int 
{ 
    return $a; 
} 
 
foo(1.0); 
# PHP Fatal error:  Uncaught TypeError: Return value of foo() must be of the type integer, float returned in test.php:6 
在声明之后，就会触发致命错误。
######################

是不是有点类似与 js 的 strict mode？
*/

##############################################################

//3. 标量类型声明

/*
PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4，即可以是函数，包括匿名函数)，现在也可以使用 string、int、float和 bool 了。

官方示例：
*/

function sumOfInts(int ...$ints) 
{ 
    return array_sum($ints); 
} 
 
var_dump(sumOfInts(2, '3', 4.1)); 


//需要注意的是上文提到的严格模式的问题在这里同样适用：强制模式（默认，既强制类型转换）下还是会对不符合预期的参数进行强制类型转换，严格模式下则触发 TypeError 的致命错误。

##############################################################


?>